package com.baosight.sczx.common.zm.cInterface.cn;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.baosight.iplat4j.core.ei.EiBlock;
import com.baosight.iplat4j.core.spring.SpringApplicationContext;
import com.baosight.iplat4j.core.threadlocal.UserSession;
import com.baosight.iplat4j.dao.Dao;
import com.baosight.sczx.common.zm.basetools.StaticTools;
import com.baosight.sczx.zm.cn.domain.ZMCNCoalAccount;

/**
 * <p>Title: CalculateStock.java</p>
 * <p>Description: 煤质管理库存计算接口</p>
 * <p>Copyright: Baosight Software LTD.co Copyright (c) 2002</p>
 * <p>Company: Baosight Software</p>
 * @author lhx
 * @version 1.0
 * <pre>Histroy:
 *          2016-10-16 16:51:32  李红星  Create
 *</pre>
 */
public class CalculateStock {
	
	private static Dao dao = (Dao)SpringApplicationContext.getBean("dao");
	
	/**
	 * 计算库存数据
	 * <p>Function: calculateStock</p>
	 * <p>Description:在各台帐上报的时候计算库存数据（包括日盘存数据） </p>
	 * @param EiBlock 传入的包含数据的block
	 * @param flag 计算符号“+”或“-”，正的表示加，负的表示减
	 * <p>return value:void</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2016-9-19 10:59:31 李红星 create
	 *    2017-3-27 20:02:26 李红星 modify 加入异常判断，发现异常，终止执行，返回错误信息
	 * </p>
	 *
	 */
	@SuppressWarnings("unchecked")
	public String calculateStock(EiBlock eiBlock,String flag,String oper_type) {
		// TODO Auto-generated method stub
		int rowcount = eiBlock.getRowCount();
		Map<String, String> _map=new HashMap<String, String>();
		for (int i = rowcount-1; i >=0 ; i--) {
			//此处采用倒序循环的原因是：列表上的数据是按日期降序排列的。上报的时候倒序刚好可以从最小日期开始计算
			if(oper_type.equals("上报")){
				String fdKeyId=(String)((HashMap<String,String>)(eiBlock.getRows().get(i))).get("fdKeyId");
				if(this.validateDuplicateExe(fdKeyId)){
					//该记录已经上报，由于网络较慢，后台数据还没有返回前台。用户又一次点击了“上报”按钮，此时，直接返回。不应该再更新库存
					System.out.println(fdKeyId+"重复上报数据被禁止！！！");
					return "重复上报数据被禁止。数据已经上报了，不要多次点击上报按钮！";
				}
			}
/*			String fdTargetDepartmentId=(String)eiBlock.getCell(i, "fdTargetDepartmentId");//客户
			if(fdTargetDepartmentId!=null && !fdTargetDepartmentId.trim().equals("")){
				_map.put("fdKeyId", fdTargetDepartmentId);
				//根据页面返回id去 后台查找到对应的客户名称
				List<?> _list = dao.query("ZMCNCustomInfo.query_interface", _map);
				_map=(Map<String, String>)_list.get(0);
				fdTargetDepartmentId=_map.get("fdShortName");
				_map=new HashMap<String, String>();
	//			if(!fdTargetDepartmentId.trim().equals("安电洗")){
					//凡是安电洗都不纳入日盘存计算:电煤/洗煤/汽车煤 add by lhx at 2016-12-26 15:16:55
					String fdCurrentDate=(String)eiBlock.getCell(i, "fdCurrentDate");
					String fdDepartmentId=(String)eiBlock.getCell(i, "fdDepartmentId");
					String fdCl=(String)eiBlock.getCell(i, "fdCl");
					_map.put("fdCurrentDate", fdCurrentDate);
					_map.put("fdDepartmentId", fdDepartmentId);
					if(flag.equals("-") && fdCl.startsWith("-")){
						_map.put("fdStockValue",fdCl.substring(1));
					}else{
						_map.put("fdStockValue", flag+fdCl);
					}
					dao.update("ZMCNStock.updatestock", _map);
	//			}
			}else{*/
				String fdCurrentDate=(String)eiBlock.getCell(i, "fdCurrentDate");
				String fdDepartmentId=(String)eiBlock.getCell(i, "fdDepartmentId");
				if(fdCurrentDate==null || fdCurrentDate.trim().equals("")
						||fdDepartmentId==null || fdDepartmentId.trim().equals("")){
					return "日期或者单位为空。不能上报，请检查数据！日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
				}
				String fdCl=(String)eiBlock.getCell(i, "fdCl");
				_map.put("fdCurrentDate", fdCurrentDate);
				_map.put("fdDepartmentId", fdDepartmentId);
//				_map.put("fdStockValue", flag+fdCl);
				if(!StaticTools.isNumeric(fdCl)){
					return "数量录入有误，请检查录入的数量是否为正确数字！";
				}
				if(flag.equals("-") && fdCl.startsWith("-")){
					_map.put("fdStockValue",fdCl.substring(1));
				}else{
					_map.put("fdStockValue", flag+fdCl);
				}
				int count=dao.update("ZMCNStock.updatestock", _map);
				if(count<=0){
					return "出问题了，更新到"+count+"条记录，请联系管理员检查数据的准确性。日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
				}
//			}
		}
		return "ok";	
	}
	
	/**
	 * 校验是否重复操作-台帐重复上报校验
	 * <p>Function: validateDuplicateExe</p>
	 * <p>Description: 校验是不是因为网络慢，用户多次点击“上报”按钮，导致库存计算错误</p>
	 * <p>return value:boolean 重复：true，不重复：false</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2017-2-9 14:38:36 李红星
	 * </p>
	 *
	 */
	@SuppressWarnings("rawtypes")
	public boolean validateDuplicateExe(String fdKeyId) {
		Map<String, String> params = new HashMap<String, String>();
		params.put("fdKeyId",fdKeyId);
		List result = dao.query("ZMCNCoalAccount.validate", params);
		if(result != null && result.size() > 0) {
			ZMCNCoalAccount _temp = (ZMCNCoalAccount)result.get(0);
			if(_temp.getFdStatus().equals("上报")){
                 return true;
			}
		}
		return false;
	}
	
	/**
	 * 计算猫儿沱库存数据
	 * <p>Function: calculateStockMET</p>
	 * <p>Description:在各台帐上报的时候计算库存数据（猫儿沱库存数据） </p>
	 * <p>销往猫儿沱的，账面库存不变，报总调相应减少;猫儿沱销出去的，账面相应减少，但是报总调也会相应变化
	 *    账面库存=猫儿沱库存+报总调库存</p>
	 * @param EiBlock 传入的包含数据的block
	 * @param source 数据来源：火车混煤、洗煤。
	 * <p>return value:void</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2016-9-19 10:59:31 李红星 create
	 *    2017-3-27 20:02:26 李红星 modify 加入异常判断，发现异常，终止执行，返回错误信息
	 * </p>
	 *
	 */
	@SuppressWarnings("unchecked")
	public String calculateStockMET(EiBlock eiBlock,String source,String oper_type) {
		// TODO Auto-generated method stub
		int rowcount = eiBlock.getRowCount();
		Map<String, String> _map=new HashMap<String, String>();
		for (int i = rowcount-1; i >=0 ; i--) {
			//此处采用倒序循环的原因是：列表上的数据是按日期降序排列的。上报的时候倒序刚好可以从最小日期开始计算
			if(oper_type.equals("上报")){
				String fdKeyId=(String)((HashMap<String,String>)(eiBlock.getRows().get(i))).get("fdKeyId");
				if(this.validateDuplicateExe(fdKeyId)){
					//该记录已经上报，由于网络较慢，后台数据还没有返回前台。用户又一次点击了“上报”按钮，此时，直接返回。不应该再更新库存
					System.out.println(fdKeyId+"重复给猫儿沱上报数据被禁止！！！");
					return "重复上报数据被禁止。数据已经上报了，不要多次点击上报按钮！";
				}
			}
			String fdCurrentDate=(String)eiBlock.getCell(i, "fdCurrentDate");
			String fdDepartmentId=(String)eiBlock.getCell(i, "fdDepartmentId");
			if(fdCurrentDate==null || fdCurrentDate.trim().equals("")
					||fdDepartmentId==null || fdDepartmentId.trim().equals("")){
				return "日期或者单位为空。不能上报，请检查数据！日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
			}
			String fdCl=(String)eiBlock.getCell(i, "fdCl");
			if(!StaticTools.isNumeric(fdCl)){
				return "数量录入有误，请检查录入的数量是否为正确数字！";
			}
			String fdPlaceId=(String)eiBlock.getCell(i, "fdPlaceId");//发出地点
			String fdTargetDepartmentId=(String)eiBlock.getCell(i, "fdTargetDepartmentId");//客户
			_map.put("fdKeyId", fdTargetDepartmentId);
			List<?> _list = dao.query("ZMCNCustomInfo.query_interface", _map);
			_map=(Map<String, String>)_list.get(0);
			fdTargetDepartmentId=_map.get("fdShortName");
			if(fdTargetDepartmentId==null || fdTargetDepartmentId.trim().equals("")){
				return "客户名称设置有误，请检查销售客户信息！参考id:"+eiBlock.getCell(i, "fdTargetDepartmentId");
			}
			_map=new HashMap<String, String>();
			//fdStockValue 账面库存 fdStockACtual 报总调库存  fdStockMaoertuo 猫儿沱库存
			//账面库存=猫儿沱库存+报总调库存
			if(fdPlaceId.equals("猫儿沱")){
				if(oper_type.equals("上报")){
					//从猫儿沱外销。猫儿沱库存减少。
					if(fdCl.startsWith("-")){
						_map.put("fdStockMaoertuo", fdCl.substring(1));
						//账面库存减少(输入负数，相当于库存增加) 以下这行增加日期2017-4-28 by 李红星
						_map.put("fdStockValue", fdCl.substring(1));
					}else{
						_map.put("fdStockMaoertuo", "-"+fdCl);
						//账面库存减少 以下这行增加日期2017-4-28 by 李红星
						_map.put("fdStockValue", "-"+fdCl);
					}
					//猫儿沱出库增加
					_map.put("fdStockOut",fdCl);
				}else{
					//退回
					//从猫儿沱外销退回。猫儿沱库存增加
					_map.put("fdStockMaoertuo", fdCl);
					//账面库存增加 以下这行增加日期2017-4-28 by 李红星
					_map.put("fdStockValue", fdCl);

					//猫儿沱出库减少
					if(fdCl.startsWith("-")){
						_map.put("fdStockOut",fdCl.substring(1));
					}else{
						_map.put("fdStockOut","-"+fdCl);
					}
				}
			}else{
				if(fdTargetDepartmentId.equals("猫儿沱")){
					if(oper_type.equals("上报")){
						//运往猫儿沱。猫儿沱库存增加
						_map.put("fdStockMaoertuo", fdCl);
						//销往猫儿沱的，账面库存不变，报总调相应减少 2017-4-28 add by lhx
						if(fdCl.startsWith("-")){
							_map.put("fdStockACtual", fdCl.substring(1));
						}else{
							_map.put("fdStockACtual", "-"+fdCl);
						}
						//猫儿沱入库增加
						_map.put("fdStockIn", fdCl);
					}else{
						//退回
						//运往猫儿沱退回。猫儿沱库存减少
						if(fdCl.startsWith("-")){
							_map.put("fdStockMaoertuo",fdCl.substring(1));
							//销往猫儿沱的退回，账面库存不变，报总调相应增加 2017-4-28 add by lhx
							_map.put("fdStockACtual", "-"+fdCl.substring(1));
						}else{
							_map.put("fdStockMaoertuo", "-"+fdCl);
							//销往猫儿沱的退回，账面库存不变，报总调相应增加 2017-4-28 add by lhx
							_map.put("fdStockACtual", fdCl);
						}
						//猫儿沱入库减少
						if(fdCl.startsWith("-")){
							_map.put("fdStockIn",fdCl.substring(1));
						}else{
							_map.put("fdStockIn", "-"+fdCl);
						}
					}
				}else{
					//从其他地方外销。
					if(source.equals("洗煤")){
						//洗煤台帐
//						if(fdTargetDepartmentId!=null && !fdTargetDepartmentId.trim().equals("安电洗")){
							//凡是安电洗都不纳入日盘存计算:电煤/洗煤/汽车煤 add by lhx at 2016-12-26 15:16:55
//							String mineCode=eiBlock.getCell(i, "fdMyNum").toString().trim();
//							if(mineCode.startsWith("JJ")
//								||mineCode.startsWith("JN")
//								||mineCode.startsWith("BJ")
//								||mineCode.startsWith("BN")
//								||mineCode.startsWith("SJ")
//								||mineCode.startsWith("SN")){
								//部分煤样编码不计入库存：JJ、JN、BJ、BN、SJ、SN 客户反映去掉日期2017-1-10 10:06:08
							if(fdTargetDepartmentId!=null && fdTargetDepartmentId.indexOf("不算量")>=0){
								//洗煤台帐中客户名称包含“不算量”字样的都不计入日盘存。提出日期2017-1-10 10:08:25
								continue;
							}else{
								if(oper_type.equals("上报")){
									//其余编码，加回总库存（洗煤及筛下煤）
									_map.put("fdStockValue", fdCl);
								}else{
									//退回
									//其余编码，加回总库存（洗煤及筛下煤）退回
									if(fdCl.startsWith("-")){
										_map.put("fdStockValue",fdCl.substring(1));
									}else{
										_map.put("fdStockValue", "-"+fdCl);
									}
								}
							}
//						}
					}else{
						if(oper_type.equals("上报")){
							//火车混煤,总库存减少
							if(fdCl.startsWith("-")){
								_map.put("fdStockValue",fdCl.substring(1));
							}else{
								_map.put("fdStockValue", "-"+fdCl);
							}
						}else{
							//退回
							//火车混煤退回,总库存增加
							_map.put("fdStockValue", fdCl);
						}
					}
				}
			}
			_map.put("fdCurrentDate", fdCurrentDate);
			_map.put("fdDepartmentId", fdDepartmentId);
			int count=dao.update("ZMCNStock.updatestock", _map);
			int count1=dao.update("ZMCNStock.updatemaoertuoinout",_map);
			if(count<=0){
				return "出问题了，更新到"+count+"条记录，请联系管理员检查数据的准确性。日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
			}
			if(count1<=0){
				return "更新猫儿沱入库和出库出问题了，更新到"+count+"条记录，请联系管理员检查数据的准确性。日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
			}
		}
		return "ok";
	}
	
	/**
	 * 煤坪转移库存数据
	 * <p>Function: calculateStock</p>
	 * <p>Description:煤坪转移台帐上报的时候计算库存数据 </p>
	 * @param EiBlock 传入的包含数据的block
	 * <p>return value:void</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2016-10-17 09:41:12 李红星 create
	 * </p>
	 *
	 */
	public String calculateStockMineMove(EiBlock eiBlock,String oper_type) {
		// TODO Auto-generated method stub
		int rowcount = eiBlock.getRowCount();
		Map<String, String> _map=new HashMap<String, String>();
		for (int i = rowcount-1; i >=0 ; i--) {	
			if(oper_type.equals("上报")){
				@SuppressWarnings("unchecked")
				String fdKeyId=(String)((HashMap<String,String>)(eiBlock.getRows().get(i))).get("fdKeyId");
				if(this.validateDuplicateExe_mineMove(fdKeyId)){
					//该记录已经上报，由于网络较慢，后台数据还没有返回前台。用户又一次点击了“上报”按钮，此时，直接返回。不应该再更新库存
					return "重复上报数据被禁止。数据已经上报了，不要多次点击上报按钮！";
				}
			}
			String fdCurrentDate=(String)eiBlock.getCell(i, "fdCurrentDate");
			String fdDepartmentId=(String)eiBlock.getCell(i, "fdDepartmentId");
			if(fdCurrentDate==null || fdCurrentDate.trim().equals("")
					||fdDepartmentId==null || fdDepartmentId.trim().equals("")){
				return "日期或者单位为空。不能上报，请检查数据！日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
			}
			String fdCl=(String)eiBlock.getCell(i, "fdStockValue");
			if(!StaticTools.isNumeric(fdCl)){
				return "数量录入有误，请检查录入的数量是否为正确数字！";
			}
			String fdMoveType=(String)eiBlock.getCell(i, "fdMoveType");//转移类型
			if(fdMoveType.equals("转出")){
				//转出。总库存减少
				if(oper_type.equals("上报")){
					if(fdCl.startsWith("-")){
						_map.put("fdStockValue",fdCl.substring(1));
					}else{
						_map.put("fdStockValue", "-"+fdCl);
					}
				}else{
					//退回，总库存增加
					_map.put("fdStockValue", fdCl);
				}
			}else{
				if(oper_type.equals("上报")){
					//转入。总库存增加
					_map.put("fdStockValue", fdCl);
				}else{
					//退回，总库存减少
					if(fdCl.startsWith("-")){
						_map.put("fdStockValue",fdCl.substring(1));
					}else{
						_map.put("fdStockValue", "-"+fdCl);
					}

				}
			}
			_map.put("fdCurrentDate", fdCurrentDate);
			_map.put("fdDepartmentId", fdDepartmentId);
			int count=dao.update("ZMCNStock.updatestock", _map);
			if(count<=0){
				return "出问题了，更新到"+count+"条记录，请联系管理员检查数据的准确性。日期：“"+fdCurrentDate+"”，单位id：“"+fdDepartmentId+"”";
			}
		}
		return "ok";
	}
	
	/**
	 * 校验是否重复操作-煤坪转移重复上报校验
	 * <p>Function: validateDuplicateExe</p>
	 * <p>Description: 校验是不是因为网络慢，用户多次点击“上报”按钮，导致库存计算错误</p>
	 * <p>return value:boolean 重复：true，不重复：false</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2017-2-9 14:38:36 李红星
	 * </p>
	 *
	 */
	@SuppressWarnings("rawtypes")
	public boolean validateDuplicateExe_mineMove(String fdKeyId) {
		Map<String, String> params = new HashMap<String, String>();
		params.put("fdKeyId",fdKeyId);
		List result = dao.query("ZMCNStock.validate", params);
		if(result != null && result.size() > 0) {
            return true;
		}
		return false;
	}
	
	/**
	 * 计算各台账月调差和年调差
	 * <p>Function: calculateStock</p>
	 * <p>Description:台帐增删改时修改月调量结余和年调量结余 </p>
	 * @param EiBlock 传入的包含数据的block
	 * @param Code_type String 煤样编码类型
	 * <p>return value:void</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2016-10-17 09:41:12 李红星 create
	 * </p>
	 *
	 */
	public void calculateSumStockModify(EiBlock eiBlock,String Code_Type) {
		// TODO Auto-generated method stub
		int rowcount = eiBlock.getRowCount();
		Map<String, String> _map=new HashMap<String, String>();
		for (int i = rowcount-1; i >=0 ; i--) {
			String fdCurrentDate=(String)eiBlock.getCell(i, "fdCurrentDate");
			String fdDepartmentId=(String)eiBlock.getCell(i, "fdDepartmentId");
			if(fdDepartmentId==null||fdDepartmentId.trim().equals("")){
				fdDepartmentId=UserSession.getInSessionProperty("orgCode").toString();
			}
			_map.put("code_type", Code_Type);
			_map.put("fdCurrentDate", fdCurrentDate);//日期
			_map.put("fdDepartmentId", fdDepartmentId);//单位
			dao.update("ZMCNCoalAccount.summodifystock", _map);
		}
	}
	
	/**
	 * 校验煤样编码不能重复
	 * <p>Function: validateMineCode</p>
	 * <p>Description:增加和修改时校验煤样编码不能重复 </p>
	 * @param fdKeyId String 主键
	 * @param MineCode String 煤样编码
	 * <p>return value:boolean true/false</p>
	 * <p>throws Exception:</p>
	 * <p>History:
	 *    2017-3-30 21:02:04 李红星 create
	 * </p>
	 */
	public boolean validateMineCode(String fdKeyId,String MineCode){
		Map<String, String> params = new HashMap<String, String>();
		if(!fdKeyId.trim().equals("")){
			params.put("modify", fdKeyId);
		}
		params.put("fdMyNum", MineCode);
		@SuppressWarnings("rawtypes")
		List result = dao.query("ZMCNCoalAccount.validate", params);
		if(result!=null && result.size()>0){
			return true;
		}
		return false;
	}
}
